Passed
Pull Request — master (#57)
by
unknown
11:34 queued 08:49
created

button.js ➔ toggle   D

Complexity

Conditions 12

Size

Total Lines 47
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 12
eloc 26
dl 0
loc 47
rs 4.8
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like button.js ➔ toggle often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
/*!
2
  * Bootstrap button.js v4.6.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
  */
6
(function (global, factory) {
7
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :
8
  typeof define === 'function' && define.amd ? define(['jquery'], factory) :
9
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Button = factory(global.jQuery));
10
})(this, (function ($) { 'use strict';
11
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
14
  var $__default = /*#__PURE__*/_interopDefaultLegacy($);
15
16
  function _defineProperties(target, props) {
17
    for (var i = 0; i < props.length; i++) {
18
      var descriptor = props[i];
19
      descriptor.enumerable = descriptor.enumerable || false;
20
      descriptor.configurable = true;
21
      if ("value" in descriptor) descriptor.writable = true;
22
      Object.defineProperty(target, descriptor.key, descriptor);
23
    }
24
  }
25
26
  function _createClass(Constructor, protoProps, staticProps) {
27
    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
28
    if (staticProps) _defineProperties(Constructor, staticProps);
29
    return Constructor;
30
  }
31
32
  /**
33
   * Constants
34
   */
35
36
  var NAME = 'button';
37
  var VERSION = '4.6.1';
38
  var DATA_KEY = 'bs.button';
39
  var EVENT_KEY = "." + DATA_KEY;
40
  var DATA_API_KEY = '.data-api';
41
  var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME];
42
  var CLASS_NAME_ACTIVE = 'active';
43
  var CLASS_NAME_BUTTON = 'btn';
44
  var CLASS_NAME_FOCUS = 'focus';
45
  var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
46
  var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY);
47
  var EVENT_LOAD_DATA_API = "load" + EVENT_KEY + DATA_API_KEY;
48
  var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]';
49
  var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]';
50
  var SELECTOR_DATA_TOGGLE = '[data-toggle="button"]';
51
  var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn';
52
  var SELECTOR_INPUT = 'input:not([type="hidden"])';
53
  var SELECTOR_ACTIVE = '.active';
54
  var SELECTOR_BUTTON = '.btn';
55
  /**
56
   * Class definition
57
   */
58
59
  var Button = /*#__PURE__*/function () {
60
    function Button(element) {
61
      this._element = element;
62
      this.shouldAvoidTriggerChange = false;
63
    } // Getters
64
65
66
    var _proto = Button.prototype;
67
68
    // Public
69
    _proto.toggle = function toggle() {
70
      var triggerChangeEvent = true;
71
      var addAriaPressed = true;
72
      var rootElement = $__default["default"](this._element).closest(SELECTOR_DATA_TOGGLES)[0];
73
74
      if (rootElement) {
75
        var input = this._element.querySelector(SELECTOR_INPUT);
76
77
        if (input) {
78
          if (input.type === 'radio') {
79
            if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
80
              triggerChangeEvent = false;
81
            } else {
82
              var activeElement = rootElement.querySelector(SELECTOR_ACTIVE);
83
84
              if (activeElement) {
85
                $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE);
86
              }
87
            }
88
          }
89
90
          if (triggerChangeEvent) {
91
            // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
92
            if (input.type === 'checkbox' || input.type === 'radio') {
93
              input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE);
94
            }
95
96
            if (!this.shouldAvoidTriggerChange) {
97
              $__default["default"](input).trigger('change');
98
            }
99
          }
100
101
          input.focus();
102
          addAriaPressed = false;
103
        }
104
      }
105
106
      if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
107
        if (addAriaPressed) {
108
          this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE));
109
        }
110
111
        if (triggerChangeEvent) {
112
          $__default["default"](this._element).toggleClass(CLASS_NAME_ACTIVE);
113
        }
114
      }
115
    };
116
117
    _proto.dispose = function dispose() {
118
      $__default["default"].removeData(this._element, DATA_KEY);
119
      this._element = null;
120
    } // Static
121
    ;
122
123
    Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) {
124
      return this.each(function () {
125
        var $element = $__default["default"](this);
126
        var data = $element.data(DATA_KEY);
127
128
        if (!data) {
129
          data = new Button(this);
130
          $element.data(DATA_KEY, data);
131
        }
132
133
        data.shouldAvoidTriggerChange = avoidTriggerChange;
134
135
        if (config === 'toggle') {
136
          data[config]();
137
        }
138
      });
139
    };
140
141
    _createClass(Button, null, [{
142
      key: "VERSION",
143
      get: function get() {
144
        return VERSION;
145
      }
146
    }]);
147
148
    return Button;
149
  }();
150
  /**
151
   * Data API implementation
152
   */
153
154
155
  $__default["default"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
156
    var button = event.target;
157
    var initialButton = button;
158
159
    if (!$__default["default"](button).hasClass(CLASS_NAME_BUTTON)) {
160
      button = $__default["default"](button).closest(SELECTOR_BUTTON)[0];
161
    }
162
163
    if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
164
      event.preventDefault(); // work around Firefox bug #1540995
165
    } else {
166
      var inputBtn = button.querySelector(SELECTOR_INPUT);
167
168
      if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
169
        event.preventDefault(); // work around Firefox bug #1540995
170
171
        return;
172
      }
173
174
      if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {
175
        Button._jQueryInterface.call($__default["default"](button), 'toggle', initialButton.tagName === 'INPUT');
176
      }
177
    }
178
  }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
179
    var button = $__default["default"](event.target).closest(SELECTOR_BUTTON)[0];
180
    $__default["default"](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type));
181
  });
182
  $__default["default"](window).on(EVENT_LOAD_DATA_API, function () {
183
    // ensure correct active class is set to match the controls' actual values/states
184
    // find all checkboxes/readio buttons inside data-toggle groups
185
    var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS));
186
187
    for (var i = 0, len = buttons.length; i < len; i++) {
188
      var button = buttons[i];
189
      var input = button.querySelector(SELECTOR_INPUT);
190
191
      if (input.checked || input.hasAttribute('checked')) {
192
        button.classList.add(CLASS_NAME_ACTIVE);
193
      } else {
194
        button.classList.remove(CLASS_NAME_ACTIVE);
195
      }
196
    } // find all button toggles
197
198
199
    buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
200
201
    for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
202
      var _button = buttons[_i];
203
204
      if (_button.getAttribute('aria-pressed') === 'true') {
205
        _button.classList.add(CLASS_NAME_ACTIVE);
206
      } else {
207
        _button.classList.remove(CLASS_NAME_ACTIVE);
208
      }
209
    }
210
  });
211
  /**
212
   * jQuery
213
   */
214
215
  $__default["default"].fn[NAME] = Button._jQueryInterface;
216
  $__default["default"].fn[NAME].Constructor = Button;
217
218
  $__default["default"].fn[NAME].noConflict = function () {
219
    $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;
220
    return Button._jQueryInterface;
221
  };
222
223
  return Button;
224
225
}));
226
//# sourceMappingURL=button.js.map
227